import { observer } from './observe/index'

export function initState(vm) {
  let opts = vm.$options
  // console.log('opts', opts);
  if(opts.props) {
    initProps()
  }
  if(opts.data) {
    initData(vm)
  }
  if(opts.watch) {
    initWatch()
  }
  if(opts.computed) {
    initComputed()
  }
  if(opts.methods) {
    initMethods()
  }
}
 
function initProps() {}
// 对data初始化
function initData(vm) {
  // console.log('data初始化', vm);
  // 对象 、函数
  let data = vm.$options.data
  // 如果是data(),那么this是指向window的；我们需要改变this指向，改为this指向vue实例
  data = vm._data = typeof data === 'function' ? data.call(vm) : data
  // 数据劫持
  // 将 data 上所有的属性代理到实例上
  for (let key in data) {
    proxy(vm, '_data', key)
  }
  observer(data)
}

function proxy(vm, source ,key) {
  Object.defineProperty(vm, key, {
    get() {
      return vm[source][key]
    },
    set(newVal) {
      vm[source][key] = newVal
    }
  })
}
function initWatch() {}
function initComputed() {}
function initMethods() {}